#include <iostream>
#include <cstring>
#include "Blob.hpp"

using namespace std;

template <typename T>
int compare(const T &v1, const T &v2)
{
    if (v1 < v2) return -1;
    if (v2 < v2) return 1;
    return 0;
}

template <unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M])
{
    return strcmp(p1, p2);
}

// 前置声明,在将模板的一个特定实例声明为友元时要用到
template <typename T> class Pal;
class C {   // C 是一个普通非模板类
    // 用类 C 实例化的 Pal 是 C 的一个友元
    friend class Pal<C>;
    // Pal2 的所有实例都是 C 的友元;这种情况无须前置声明
    template <typename T> friend class Pal2;
};

template <typename T> class C2 {  // C2 本身是一个类模板
    // C2 的每个实例将相同实例化的 Pal 声明为友元
    friend class Pal<T>;  // Pal 的模板声明必须在作用域之内
    // Pal2 的所有实例都是 C2 的每个实例的友元,不需要前置声明
    template <typename X> friend class Pal2;
    // Pal3 是一个非模板类,它是 C2 所有实例的友元
    friend class Pal3;  // 不需要 Pal3 的前置声明
};


int main()
{
    Blob<int> ia;   // 空 Blob<int>
    Blob<int> ia2 = {0, 1, 2, 3, 4};
    return 0;
}
